package 设计模式.一单例模式.snippet5;

import java.util.Objects;

/**
 * 懒汉式 同步代码块 不推荐使用
 *
 * 优缺点说明:
 * 1)这种方式，本意是想对第四种实现方式的改进，因为前面同步方法效率太低，
 * 改为同步产生实例化的的代码块
 * 2)但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一
 * 致，假如一个线程进入了if (singleton == null)判断语句块，还未来得及往下执行，
 * 另一个线程也通过了这个判断语句，这时便会产生多个实例.
 * 3)结论:在实际开发中，不能使用这种方式
 */
public class SingletonTest05 {
    public static void main(String[] args) {
        //测试
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.printf("instance1与instance2是否相等:%s%n", instance1 == instance2);
        System.out.println(instance1.hashCode());
        System.out.println(instance2.hashCode());
    }
}

//懒汉式 线程不安全，同步代码块(不推荐使用)
class Singleton {
    private static Singleton INSTANCE;

    private Singleton() {
    }

    //提供一个静态得共有方法，加入同步处理的代码(添加synchronized关键字)，解决线程安全问题
    //即懒汉式
    public static Singleton getInstance() {
        if (Objects.isNull(INSTANCE)) {
            synchronized (Singleton.class) {
                INSTANCE = new Singleton();
            }
        }
        return INSTANCE;
    }
}


